#ifndef EXPORTSTATEMANAGER_H
#define EXPORTSTATEMANAGER_H

#include <QObject>
#include <QTimer>
#include <QString>
#include <QStringList>
#include <QDateTime>

/**
 * ExportStateManager - 简化的导出状态管理器
 *
 * Martin Fowler 重构原则：
 * 1. Single Responsibility - 专注于导出状态管理，不检查文件状态
 * 2. Observer Pattern - 被动接收通知，不主动查询
 * 3. Extract Method - 消除复杂的状态模式和多态
 * 4. Remove Redundancy - 清理不必要的定时器和依赖
 *
 * 职责：
 * - 管理导出状态（3个核心状态）
 * - 处理导出进度跟踪
 * - 协调导出流程控制
 * - 提供统一的状态接口
 */

class ExportStateManager : public QObject
{
    Q_OBJECT

public:
    // 导出状态枚举 - 简化为4个核心状态
    enum class ExportState {
        Disabled,    // 不可用（无文件或正在导出其他文件）
        Available,   // 可用（有文件可导出，显示呼吸灯）
        Exporting,   // 导出中（显示取消按钮）
        Cancelling   // 取消中（忽略延迟信号，等待线程完成）
    };
    Q_ENUM(ExportState)

public:
    // 进度信息结构
    struct ExportProgress {
        int completedFiles = 0;
        int totalFiles = 0;
        QString currentFile;
        QString status;

        // 阶段化进度支持（方案1：解决进度条延迟问题）
        int currentPhase = 0;        // 当前阶段：1=页面收集, 2=PDF导出
        int phaseWeight = 100;       // 当前阶段在总进度中的权重（百分比）
        double phaseProgress = 0.0;  // 当前阶段内的进度（0-100）

        double percentage() const {
            if (totalFiles <= 0) return 0.0;

            // 基础文件进度
            double fileProgress = (double)completedFiles / totalFiles;

            // 阶段化总进度计算
            double totalProgress = 0.0;
            if (currentPhase == 1) {
                // 阶段1：页面收集（占总进度30%）
                totalProgress = fileProgress * 30.0;
            } else if (currentPhase == 2) {
                // 阶段2：PDF导出（占总进度70%，其中50%为页面处理，20%为PDF生成）
                totalProgress = 30.0 + (fileProgress * 70.0);
            }

            return qMin(totalProgress, 100.0);
        }

        bool isInProgress() const {
            return completedFiles < totalFiles && totalFiles > 0;
        }
    };

    explicit ExportStateManager(QObject* parent = nullptr);
    ~ExportStateManager();

    // Martin Fowler重构：简化的接口（移除文件浏览器依赖）
    void setExportAvailability(bool available);  // 接收导出可用性通知

    // 核心状态管理
    ExportState currentState() const;
    const ExportProgress& progress() const { return m_progress; }
    bool canExport() const;
    bool isExporting() const;

    // Martin Fowler重构：移除文件状态管理（由CustomFileBrowser负责）

    void startExport(int totalFiles);
    void updateProgress(int completedFiles, const QString& currentFile = "", const QString& status = "");
    void updateProgressFromManager(int completedFiles, int totalFiles, const QString& status = "");  // 适配MergedExportManager

    // 阶段化进度支持（方案1：解决进度条延迟问题）
    void updateProgressWithPhase(int completedFiles, int totalFiles, int phase, const QString& currentFile = "", const QString& status = "");
    void setPhase(int phase, const QString& phaseDescription = "");  // 设置当前阶段

    void completeExport();
    void failExport(const QString& error);
    void cancelExport();

signals:
    // 状态变化信号
    void stateChanged(ExportState newState);
    void progressUpdated(const ExportProgress& progress);

    // 导出生命周期信号 - 传递详细信息供UI使用
    void exportStarted(int totalFiles, const QString& message = "开始导出...");
    void exportCompleted(const QString& outputPath = "");
    void exportFailed(const QString& error);
    void exportCancelled();

    // Toast信号 - 只在最关键的时候发送
    void exportCompletedToast(const QString& message);
    void exportFailedToast(const QString& error);

    // Martin Fowler重构：移除观察者信号（改为被动接收）

private:
    // Martin Fowler重构：简化的状态更新方法
    void setState(ExportState newState);
    void updateProgressInternal(int completedFiles, const QString& currentFile, const QString& status);
    void resetProgress();

    // Martin Fowler重构：简化的状态管理（移除复杂的状态模式）
    ExportState m_state = ExportState::Disabled;
    ExportProgress m_progress;

    // 完成延迟定时器（保留一个用于导出完成处理）
    QTimer* m_completionTimer;
    static const int COMPLETION_DELAY_MS = 2000;
};

// 注册结构体到Qt元对象系统
Q_DECLARE_METATYPE(ExportStateManager::ExportProgress)

#endif // EXPORTSTATEMANAGER_H